/*-*
 * FILENAME  :
 *    $HeadURL$
 *
 * STATUS  :
 *    $Revision$
 *
 *    $Author$
 *    $Date$
 *  
 *    
 * Copyright (c) 2011 Gonalge Ltda. All rights reserved.
 *
 ****************************************************************/

package org.gonalge.arbolrojonegro.negocio;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author Geremias Gonzalez
 */
public class ArchivoConcepto {

    private final List<String> conceptos = new ArrayList<String>();

    private int index = 0;
    
    private void setConceptoArbolRojoNegro(){
      conceptos.add("CONCEPTO.- Los árboles Rojo y Negro especializados en búsqueda donde de acuerdo con su estructura esta garantizado\n" +
      "que las ejecuciones de inserción, eliminación y búsqueda son logarítmicas.\n\n" +
      "CARACTERISTICAS DE ARBOL ROJO Y NEGRO.- Tiene dos tipos de nodos internos y externos los nodos internos son aquellos\n" +
      "que tienen relacionados un valor, los nodos externos son aquellos que no tienen un valor y se colocan como elementos\n" +
      "terminales.\n\n" +
      "\t1. Los nodos internos pueden ser Rojos o Negros.\n"+
      "\t2. Los nodos externos siempre son negros.\n"+
      "\t3. La raíz de una árbol Rojo y Negro siempre debe ser negra.\n"+
      "\t4. Los nodos relacionados  a un nodo rojo siempre deben ser negros.\n"+
      "\t5. La cantidad de nodos negros desde la raíz a un nodo terminal siempre\n" +
      "\t    es la misma para todos los nodos terminales.");       
    }
      
    private void setConceptoRecprridos(){
      conceptos.add("Extisten 4 tipos de recorridos:\n\n" +
      "1. Recorrido Preorden A: raiz 'e', preorden del subarbol Izquierdo 'SI', preorden del subarbol Derecho 'SD'.\n\n" +
      "2. Recorrido Inorden A: preorden del subarbol Izquierdo 'SI', raiz 'e',preorden del subarbol Derecho 'SD'\n" +
      "   (se obtiene los elementos en forma ascendente).\n\n" +
      "3. Recorrido Posorden A: preorden del subarbol Izquierdo 'SI', preorden del subarbol Derecho 'SD', raiz 'e'. \n\n" +
      "4. Recorrido por Niveles A: Elemneto del nivel 1, Elemetos del nivel 2,...,Elementos del nivel n.");
    }
     
    private void setConceptoInsercion(){
      conceptos.add("METODO DE INSERCION.- La insercion tiene los siguientes pasos:\n\n" +
      "PASO 1.- Se de be insertar el nuevo elemento en forma normal como si se tratase de un arbol binario ordenado. \n\n" +
      "PASO 2.- Se de be remplazar un nodo externo por un nuevo nado y a ese se debe asociar dosa nodos externos.\n\n" +
      "PASO 3.- Si en nuevo nodo es la raiz del arbol se debe pintar el nuevo nodo de color negro. \n\n" +
      "PASO 4.- Si el nuevo nodo no es raiz se debe pintar de color rojo. \n\n" +
      "PASO 5.- Si el nuevo nodo entra en relacion con su nodo padre y ambos tinen el color rojo rojo, se presenta un problema \n" +
      "que rompe una condicion de nodos internos al cual se denomina doble rojo, y se soluciona atra vez de transformaciones \n" +
      "o cambio de color");
    }
      
    private void setSolucionRojoRojo(){
      conceptos.add("SOLUCION AL PROBLEMA ROJO ROJO \n\n" +
      "FORMA 1 'TRANSFORMACION'.- Este caso se presenta cuando el hermano de 'e1' es negro, y se aplican los siguiente pasos:\n" +
      "    PASO 1.- Se debe renombrar los nodos e, e1 y e2 por (A,B,C) de tal forma que un recorrido inorden de la secuensi A; B; C;\n" +
      "    PASO 2.- Se debe colocar a B como la nueva raiz y A y C como los nodos dependientes de B.\n" +
      "    PASO 3.- Se debe colocar a B el color negro y a A y a C se debe colocar color rojo.\n\n" +
      "FORMA 2 'CAMBIO DE COLOR'.- Esta forma es aplicable cuando el hermano de e1 es de color rojo y se siguen los \ns" +
      "iguientes pasos:\n" +
      "    PASO 1.-Se cambia de color a e1 y a su hermano por el color negro.\n" +
      "    PASO 2.- Se cambia de color a e por el color rojo siempre y cuando este no sea la raiz.\n" +
      "    PASO 3.- Si el problema del doble rojo persiste desde de e hacia sus ansestros entonces se puede aplicar muchas \n" +
      "    veces la forma dos y una sola ves la forma uno.");      
    }
      
    private void setConceptosBasicos(){
      conceptos.add("\nConceptos:\n\n\tALTURA.- Es la rama mas Larga del Arbol.\n\n" +
      "\tPESO.- Es el número de nodo internos que tiene el Arbol.\n\n" +
      "\tHOJAS.- Es aquel que tiene sus dos nodo externos.\n\n" +
      "\tNIVEL.- Es la altura en que se encuentra el elemento.");
    }
      
    public String getConsultar(){
        return conceptos.get(index);
    }
     
    public void cargarConceptos(){
       setConceptoArbolRojoNegro(); 
       setConceptoRecprridos();
       setConceptosBasicos();
       setConceptoInsercion();
       setSolucionRojoRojo();
    } 

    public int getPos() {
        return index;
    }

    public void siguiente() {
        if (haySiguiente())
            index++;
    }

    public void atras() {
        if (hayAtras())
            index--;
    }

    public boolean haySiguiente() {
        return (index < conceptos.size() - 1);

    }

    public boolean hayAtras() {
        return (index > 0);

    }
}
